package com.ambow.shop.action.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import com.ambow.shop.action.Action;
import com.ambow.shop.domain.Product;
import com.ambow.shop.domain.ProductCategory;
import com.ambow.shop.domain.ProductForm;
import com.ambow.shop.service.impl.ProductServiceImpl;
import com.ambow.shop.validator.ProductValidator;

/**
 * 新增产品业务流程。
 * 
 * @author chunw
 *
 */
public class AddProductAction implements Action {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) {
		List<String> errors = new ArrayList<String>();

		// 获取到了part对象，并对其可能的异常进行处理。
		Part part = null;
		try {
			part = request.getPart("image");
		} catch (IOException | ServletException e) {
			e.printStackTrace();
			errors.add("部件操作异常, 添加失败。");
			request.setAttribute("errors", errors);
			return "../product/list";
		}

		// 获取表单提交数据，放入表单对象；
		ProductForm form = getFormData(request, part);
		// 验证表单信息；
		errors = new ProductValidator().validate(form);
		// 判断是否存在错误；
		if (errors.isEmpty()) { // 若无；
			Product product = convert(form);
			String fileName = getRandomFileName(request, product.getImage());
			try {
				// 这个位置的路径，可获取实际路径，但在jetty下，有点不同，暂时这样，后面再改；
				part.write("../../src/main/webapp/image/product/" + fileName);
			} catch (IOException e) {
				e.printStackTrace();
				errors.add("部件操作异常, 添加失败。");
				request.setAttribute("errors", errors);
				return "../product/list";
			}
			
			product.setImage("../image/product/" + fileName);
			boolean success = new ProductServiceImpl().addProduct(product);
			// 判断是否执行成功；
			if (!success) { // 若否；
				errors.add("新增产品出现异常，添加失败");
				request.setAttribute("errors", errors);
			}
			return "../product/list";
		} else { // 若有；
			request.setAttribute("errors", errors);
			request.setAttribute("product", form);
			return "../product/input";
		}
	}

	/**
	 * 从请求中，获取表单数据，返回表单对象。
	 * 
	 * @param request 请求；
	 * @return 表单对象。
	 */
	private ProductForm getFormData(HttpServletRequest request, Part part) {
		return new ProductForm(null, request.getParameter("name").trim(), request.getParameter("description").trim(),
				request.getParameter("price").trim(), getFileName(part), request.getParameter("categoryId").trim());
	}

	/**
	 * 将给定的产品表单转为产品。
	 * 
	 * @param form 产品表单；
	 * @return 产品；
	 */
	private Product convert(ProductForm form) {
		String name = form.getName();
		String description = form.getDescription();
		double price = Double.parseDouble(form.getPrice());
		String image = form.getImage();
		int categoryId = Integer.parseInt(form.getCategoryId());
		return new Product(0, name, description, price, image, new ProductCategory(categoryId, null, null));
	}

	/**
	 * 获取部件中所包含的实际文件名。
	 * 
	 * @param part
	 * @return
	 */
	private String getFileName(Part part) {
		String contentDispositionHeader = part.getHeader("content-disposition");
		String[] elements = contentDispositionHeader.split(";");
		for (String element : elements) {
			if (element.trim().startsWith("filename")) {
				return element.substring(element.indexOf('=') + 1).trim().replace("\"", "");
			}
		}
		return null;
	}

	private String getRandomFileName(HttpServletRequest request, String fileName) {
		return Long.toString(new Date().getTime()) + fileName.substring(fileName.lastIndexOf("."));
	}
}
